# 1 如何定义一个类
# 2 类的成员：
#   属性：类属性(定义在外面的，通过实例也可以访问)，
#       实例属性（绑定到self上的，实例方法默认self是第一个参数，python系统会默认帮忙传参）
#   方法 类方法@classmethod修饰的，默认第一个参数为cls代表类本身，
#       静态方法@staicmethod修饰的，没有默认第一个参数
#        实例方法默认第一个参数为self，代表对象本身
#  3 python 属性与方法的访问与java类似
#        通过类名可以访问类方法或者静态方法
#        通过属性名也可以访问类方法或者静态方法，但是多个实例访问类属性时指向的是同一块内存空间
#        实例方法可以访问类属性或者类方法，需要通过类名或者__class__来进行
#        类方法中无法访问实例属性或者实例方法
#  4 python参数的传递遵循鸭子模型，也就是说不会实际校验类型，只要有对应的属性就可以
#  5 多继承以及__mro__，子类方法或者属性的查找顺序：
#   如果子类有就使用子类的
#   如果子类没有则按着__mro__的顺序去父类中查找直到找到为止
#  6 子类中如何调用父类的属性或者方法
#      通过父类的类名，或者super()函数范围，super()返回__mro__除当前类外第一个父类类似于java的super
#  7 python没有很强的访问限定修饰符一般：
#    _ 开头的代表受保护的protected
#    __ 开头的代表私有的private，python会对双下划线的变量进行改名，改为_类名__属性名
#    __a__ 一般为python内置的不建议使用
#  8 常用的内置属性
#    __dict__
#    __class__
#    __doc__
#    __mro__
#    __base__
#    __name__
#    __slots__
#   __module__
#  9 常用内置魔法方法
#     __new__()
#     __init__()
#     __del__()
#     __call__()
#     __eq__()
#     __set__()
#     __get__()
#     ___del__()
#     __str__()
#     __setattr__()
#     __getattr__()
#     __delattr__()
#     __setitem__()
#     __getitem__()
#     __delitem__()
#     __iter__()
#     __next__()
#     __lt__()
#     __gt__()
#     __le__()
#     __ge__()